/**
 * @description 基础视图控制器
 * @class {BaseController}
 * @author hhx
 * @date 2024-11-18 08:11
 * @version 0.1.2
 */
export class BaseController {

    /**
     * @description 事件对象
     * @private
     * @type {Map}
     */
    _events = null;

    /**
     * @description 基础控制器构造函数
     * @public
     * @constructor
     */
    constructor() {
        this._events = new Map();
    }

    //========================== 内部属性 ==========================

    /**
     * @description 获取 事件对象
     * @property
     * @return {Map} 事件对象集合
     */
    get events() {
        return this._events;
    }

    /**
     * @description 设置 事件
     * @property
     * @protected
     * @param value {Map} 事件集合
     */
    set events(value) {
        this._events = value;
    }

    //========================== 属性方法 ==========================

    /**
     * @description 获取 事件集合
     * @public
     * @return {Map} 事件集合
     */
    getEvents() {
        return this.events;
    }

    /**
     * @description 设置事件集合
     * @public
     * @param value {Map} 事件集合
     */
    setEvents(value) {
        this.events.set(value, value);
    }

    /**
     * @description 是否存在事件
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasEvents(value) {
        return this.events.has(value);
    }

    //========================== 事件触发 ==========================

    /**
     * @description 发布消息
     * @public
     * @param event {string} 事件名
     * @param value {Event} 事件对象
     */
    pubSub(event, value) {

        //获取订阅事件数组
        let events = this.events.get(event);

        //判断数组长度长度是否存在
        if (events.length > 0) {

            //循环执行
            for (const callback of events) {
                callback(value)
            }

        }
    }

    //========================== 事件订阅 ==========================

    /**
     * @description 订阅事件
     * @public
     * @param event {string} 事件名
     * @param fn {Function} 回调函数
     */
    subscribe(event, fn) {

        //判断是否存在该事件
        if (this.hasEvents(event)) {

            //获取事件集合
            let events = this.getEvents();

            //获取该事件数组
            let eventArr = events.get(event);

            //向事件数组添加回调
            eventArr.push(fn)
            this.events.set(event, eventArr);

        } else {

            //创建事件数组
            let eventArr = [];

            //添加事件回调
            eventArr.push(fn);
            this.events.set(event, eventArr);
        }

    }

}

